#!/bin/bash

# ============================================================
# OHOS 测试服务器 - 简化证书生成脚本
# 用途：生成用于测试的自签名证书（非生产环境）
# ============================================================

# 颜色定义
RESET='\033[0m'
GREEN='\033[32m'
YELLOW='\033[33m'
CYAN='\033[36m'

# 证书目录
CERT_DIR="$(cd "$(dirname "$0")" && pwd)/cert"
mkdir -p "$CERT_DIR"

echo -e "${CYAN}========================================${RESET}"
echo -e "${CYAN}  OHOS 测试证书生成工具${RESET}"
echo -e "${CYAN}========================================${RESET}"
echo ""

# 检查是否已存在证书
if [ -f "$CERT_DIR/server.crt" ] && [ -f "$CERT_DIR/server.key" ]; then
    echo -e "${YELLOW}⚠️  证书文件已存在！${RESET}"
    echo ""
    read -p "是否覆盖现有证书? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${GREEN}✅ 保留现有证书${RESET}"
        exit 0
    fi
    echo ""
fi

cd "$CERT_DIR" || exit 1

echo -e "${CYAN}📝 生成测试用自签名证书...${RESET}"
echo ""

# 生成服务器私钥和自签名证书（一步完成，有效期1年）
openssl req -x509 -newkey rsa:2048 -nodes \
    -keyout server.key \
    -out server.crt \
    -days 365 \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=OHOS Test/OU=Test/CN=localhost" \
    -addext "subjectAltName=DNS:localhost,DNS:*.local,IP:127.0.0.1,IP:0.0.0.0" \
    2>/dev/null

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✅ 证书生成成功！${RESET}"
    echo ""
    echo -e "${CYAN}📁 证书位置:${RESET}"
    echo -e "   服务器证书: $CERT_DIR/server.crt"
    echo -e "   服务器私钥: $CERT_DIR/server.key"
    echo ""
    echo -e "${CYAN}📋 证书信息:${RESET}"
    openssl x509 -in server.crt -noout -subject -dates 2>/dev/null | sed 's/^/   /'
    echo ""
    echo -e "${YELLOW}⚠️  注意事项:${RESET}"
    echo -e "   1. 此证书为自签名证书，仅用于测试"
    echo -e "   2. 客户端需要使用 --insecure 或忽略证书验证"
    echo -e "   3. 有效期为 1 年，过期后需重新生成"
    echo ""
    echo -e "${CYAN}🔧 使用示例:${RESET}"
    echo -e "   curl https://localhost:4001 --insecure"
    echo ""
else
    echo -e "${RED}❌ 证书生成失败${RESET}"
    exit 1
fi

# 可选：生成客户端证书（用于双向认证测试）
echo -e "${CYAN}========================================${RESET}"
read -p "是否生成客户端证书用于双向认证测试? (y/N): " -n 1 -r
echo
echo ""

if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${CYAN}📝 生成客户端证书...${RESET}"
    
    # 使用服务器证书作为 CA（简化版）
    cp server.crt ca.crt
    cp server.key ca.key
    
    # 生成客户端私钥和证书签名请求
    openssl req -newkey rsa:2048 -nodes \
        -keyout client.key \
        -out client.csr \
        -subj "/C=CN/ST=Beijing/L=Beijing/O=OHOS Test/OU=Client/CN=client" \
        2>/dev/null
    
    # 使用服务器证书签名客户端证书
    openssl x509 -req -in client.csr \
        -CA ca.crt -CAkey ca.key \
        -CAcreateserial -out client.crt \
        -days 365 \
        2>/dev/null
    
    # 清理临时文件
    rm -f client.csr ca.srl
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ 客户端证书生成成功！${RESET}"
        echo ""
        echo -e "${CYAN}📁 客户端证书位置:${RESET}"
        echo -e "   客户端证书: $CERT_DIR/client.crt"
        echo -e "   客户端私钥: $CERT_DIR/client.key"
        echo -e "   CA 证书: $CERT_DIR/ca.crt"
        echo ""
        echo -e "${CYAN}🔧 双向认证使用示例:${RESET}"
        echo -e "   curl https://localhost:4002 \\"
        echo -e "     --cert $CERT_DIR/client.crt \\"
        echo -e "     --key $CERT_DIR/client.key \\"
        echo -e "     --cacert $CERT_DIR/ca.crt"
        echo ""
    else
        echo -e "${YELLOW}⚠️  客户端证书生成失败，但服务器证书可用${RESET}"
    fi
else
    echo -e "${GREEN}✅ 仅生成服务器证书${RESET}"
fi

echo -e "${CYAN}========================================${RESET}"
echo -e "${GREEN}✅ 证书生成完成！${RESET}"
echo -e "${CYAN}========================================${RESET}"
